package com.ruoyi.restaurant.service.impl;

import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.restaurant.domain.Menu;
import com.ruoyi.restaurant.mapper.RestMenuMapper;
import com.ruoyi.restaurant.service.IRestMenuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;

@Service
public class RestMenuServiceImpl implements IRestMenuService
{
    @Autowired
    private RestMenuMapper menuMapper;
    /**
     * 查询菜单信息
     *
     * @param menu 菜单信息
     * @return 菜单集合
     */
    @Override
    public List<Menu> getMenuList(Menu menu)
    {
        return menuMapper.getMenuList(menu);
    }
    /**
     * 查询id的菜单信息
     *
     * @param id id
     * @return 菜单集合
     */
    @Override
    public Menu getMenuById(Long id)
    {
        return menuMapper.getMenuById(id);
    }
    /**
     * 删除id的菜单信息
     *
     * @param id id
     * @return 菜单集合
     */
    @Override
    public int deleteMenuById(long id)
    {
        return menuMapper.deleteMenuById( id);
    }

    /**
     * 删除id的菜单信息
     *
     * @param ids ids
     * @return 菜单集合
     */
    public int deleteMenuByIds (Object params){
        return menuMapper.deleteMenuByIds(params);
    }
    /**
     * 新增菜单信息
     *
     * @param menu
     * @return 菜单集合
     */
    @Override
    public int insertMenu(Menu menu){
        return  menuMapper.insertMenu(menu);
    }
    /**
     * 修改菜单信息
     *
     * @param menu menu
     * @return 菜单集合
     */
    @Override
    public int updateMenu(Menu menu){
        return menuMapper.updateMenu(menu);
    }
    /*
    导出
    */
    @Override
    public AjaxResult exportMenu(Menu menu)
    {
        return menuMapper.exportMenu (menu);
    }
    
    /**
     * 导入菜单数据
     *
     * @param menuList 菜单数据列表
     * @param isUpdateSupport 是否更新支持，如果已存在，则进行更新数据
     * @param operName 操作用户
     * @return 结果
     */
    @Override
    public String importMenu(List<Menu> menuList, Boolean isUpdateSupport, String operName)
    {
        if (StringUtils.isNull(menuList) || menuList.size() == 0)
        {
            throw new ServiceException("导入菜单数据不能为空！");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        
        for (Menu menu : menuList)
        {
            try
            {
                // 数据验证
                this.validateMenuData(menu);
                
                // 验证是否存在这个菜单（根据菜单名称判断）
                Menu existMenu = null;
                if (StringUtils.isNotEmpty(menu.getName()))
                {
                    Menu queryMenu = new Menu();
                    queryMenu.setName(menu.getName());
                    List<Menu> existMenus = menuMapper.getMenuList(queryMenu);
                    if (StringUtils.isNotEmpty(existMenus))
                    {
                        existMenu = existMenus.get(0);
                    }
                }
                
                if (StringUtils.isNull(existMenu))
                {
                    // 新增菜单
                    this.insertMenu(menu);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、菜单 " + menu.getName() + " 导入成功");
                }
                else if (isUpdateSupport)
                {
                    // 更新菜单
                    menu.setId(existMenu.getId());
                    this.updateMenu(menu);
                    successNum++;
                    successMsg.append("<br/>" + successNum + "、菜单 " + menu.getName() + " 更新成功");
                }
                else
                {
                    failureNum++;
                    failureMsg.append("<br/>" + failureNum + "、菜单 " + menu.getName() + " 已存在");
                }
            }
            catch (Exception e)
            {
                failureNum++;
                String msg = "<br/>" + failureNum + "、菜单 " + menu.getName() + " 导入失败：";
                failureMsg.append(msg + e.getMessage());
            }
        }
        if (failureNum > 0)
        {
            failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
            throw new ServiceException(failureMsg.toString());
        }
        else
        {
            successMsg.insert(0, "恭喜您，数据已全部导入成功！共 " + successNum + " 条，数据如下：");
        }
        return successMsg.toString();
    }
    
    /**
     * 验证菜单数据
     * 
     * @param menu 菜单数据
     */
    private void validateMenuData(Menu menu)
    {
        if (StringUtils.isBlank(menu.getName()))
        {
            throw new ServiceException("菜单名称不能为空");
        }
        if (menu.getName().length() > 50)
        {
            throw new ServiceException("菜单名称长度不能超过50个字符");
        }
        if (StringUtils.isNull(menu.getPrice()))
        {
            throw new ServiceException("价格不能为空");
        }
        if (menu.getPrice().compareTo(BigDecimal.valueOf(0.01)) < 0)
        {
            throw new ServiceException("价格必须大于0.01");
        }
        if (menu.getPrice().compareTo(BigDecimal.valueOf(999999.99)) > 0)
        {
            throw new ServiceException("价格不能超过999999.99");
        }
        if (StringUtils.isNotEmpty(menu.getDescription()) && menu.getDescription().length() > 200)
        {
            throw new ServiceException("描述信息长度不能超过200个字符");
        }
        if (StringUtils.isNotEmpty(menu.getStatus()) && !"0".equals(menu.getStatus()) && !"1".equals(menu.getStatus()))
        {
            throw new ServiceException("售卖状态只能是0（正常）或1（停用）");
        }
        
        // 如果状态为空，设置默认值
        if (StringUtils.isBlank(menu.getStatus()))
        {
            menu.setStatus("0");
        }
    }
}
